// HTTP请求工具
import axios from 'axios'

// 创建axios实例
const service = axios.create({
  baseURL: '', // 使用相对路径，通过vite代理转发
  timeout: 30000 // 增加超时时间到30秒
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 添加token到请求头
    const token = localStorage.getItem('token')
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  error => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    // 允许通过 meta.raw 跳过业务 code 校验，直接返回 data（兼容返回原始数组的接口）
    if (response.config && response.config.meta && response.config.meta.raw) {
      return res
    }
    
    // 处理 Result 类型的响应（有 success 字段）
    if (res && typeof res === 'object' && 'success' in res) {
      if (!res.success) {
        console.error('接口错误:', res.message)
        return Promise.reject(new Error(res.message || '请求失败'))
      }
      return res
    }
    
    // 处理传统的 code 字段响应
    if (res && typeof res === 'object' && 'code' in res) {
      if (res.code !== 0 && res.code !== 200) {
        console.error('接口错误:', res.message)
        return Promise.reject(new Error(res.message || '请求失败'))
      }
      return res
    }
    
    // 没有 code 或 success 字段，默认直接返回（用于纯数组/对象返回的接口）
    return res
  },
  error => {
    console.error('响应错误:', error)
    
    // 处理不同类型的错误
    if (error.code === 'ECONNABORTED' && error.message.includes('timeout')) {
      console.error('请求超时，请检查网络连接或稍后重试')
      return Promise.reject(new Error('请求超时，请检查网络连接或稍后重试'))
    }
    
    if (error.response?.status === 401) {
      // token过期，跳转到登录页
      localStorage.removeItem('token')
      window.location.href = '/'
      return Promise.reject(new Error('登录已过期，请重新登录'))
    }
    
    if (error.response?.status === 500) {
      console.error('服务器内部错误:', error.response.data)
      return Promise.reject(new Error('服务器内部错误，请联系管理员'))
    }
    
    if (error.response?.status === 404) {
      console.error('接口不存在:', error.config.url)
      return Promise.reject(new Error('接口不存在，请联系管理员'))
    }
    
    // 其他错误
    const errorMessage = error.response?.data?.message || error.message || '网络请求失败'
    console.error('请求失败:', errorMessage)
    return Promise.reject(new Error(errorMessage))
  }
)

export default service
